#include "file_manage.hpp"
#include "config.hpp"
#include "data_manage.hpp"
#include "hot_manage.hpp"
#include "server.hpp"
#include <thread>

void FileTest(const std::string &filename)
{
    // // 属性测试
    // cloud::filemanage fm(filename);
    // std::cout << "文件名：" << fm.FileName() << std::endl;
    // std::cout << "文件大小：" << fm.FileSize() << std::endl;
    // std::cout << "最后一次查看数据：" << fm.LastATime() << std::endl;
    // std::cout << "最后一次修改数据：" << fm.LastMTime() << std::endl;

    // // 读写测试
    // cloud::filemanage fm1(filename);
    // std::string str;
    // fm1.GetContent(str);

    // // std::cout << str << std::endl;

    // cloud::filemanage fm2("./hello.txt");
    // fm2.SetContent(str);

    // // 压缩与解压缩测试
    // std::string str = "testpack";
    // cloud::filemanage fm1(filename);
    // fm1.Compress(str);
    
    // // cloud::filemanage fb1(str);
    // // std::cout << "压缩文件名：" << fb1.FileName() << std::endl;
    // // std::cout << "文件大小：" << fb1.FileSize() << std::endl;
    // // std::cout << "-------------------------------------" << std::endl;

    // cloud::filemanage fm2(str);
    // fm1.UnCompress("testunpack");

    // // cloud::filemanage fb2("testunpack");
    // // std::cout << "解压缩文件名：" << fb2.FileName() << std::endl;
    // // std::cout << "文件大小：" << fb2.FileSize() << std::endl;

    cloud::filemanage fm1(filename);
    std::vector<std::string> vs;
    fm1.CreateDirectory();
    fm1.GetDirectory(vs);
    for(auto &v:vs)
    {
        std::cout << v << std::endl;
    }
}
void JsonTest()
{
    // 序列化
    std::string name = "小明";
    int age = 19;
    float score[] = {85,88.5,99};
    Json::Value root;
    root["姓名"] = name;
    root["年龄"] = age;
    root["成绩"].append(score[0]);
    root["成绩"].append(score[1]);
    root["成绩"].append(score[2]);
    std::string json_str;
    cloud::Jsonmanage::Serialize(root,json_str);
    std::cout << json_str << std::endl;

    // 反序列化
    Json::Value val;
    cloud::Jsonmanage::UnSerialize(json_str,val);
    std::cout << val["姓名"].asString() << std::endl;
    std::cout << val["年龄"].asInt() << std::endl;
    for(int i = 0;i < val["成绩"].size();i++)
    {
        std::cout << val["成绩"][i].asFloat() << std::endl;
    }
}
void ConfigTest()
{
    cloud::Config *config = cloud::Config::GetInstance();
    std::cout << config->GetHotTime() << std::endl;
    std::cout << config->GetServerPort() << std::endl;
    std::cout << config->GetServerIp() << std::endl;
    std::cout << config->GetDownloadPrefix() << std::endl;
    std::cout << config->GetPackFileSuffix() << std::endl;
    std::cout << config->GetPackDir() << std::endl;
    std::cout << config->GetBackDir() << std::endl;
    std::cout << config->GetBackupFile() << std::endl;
}
void DataTest(std::string filename)
{
    cloud::DataManager data;
    std::vector<cloud::BackupInfo>array;
    data.GetAll(array);
    for(auto &a:array)
    {
        std::cout << a._packflag << std::endl;
        std::cout << a._fsize << std::endl;
        std::cout << a._atime << std::endl;
        std::cout << a._mtime << std::endl;
        std::cout << a._realpath << std::endl;
        std::cout << a._packpath << std::endl;
        std::cout << a._url << std::endl;
    }

    // cloud::BackupInfo info;
    // info.NewBackupInfo(filename);

    // cloud::DataManager data;
    // std::cout << "-------------------insert and GetOneByUrl--------------------\n";
    // data.Insert(info);
    // cloud::BackupInfo tmp;
    // data.GetOneByUrl("/download/bundle.h",tmp);
    // std::cout << tmp._packflag << std::endl;
    // std::cout << tmp._fsize << std::endl;
    // std::cout << tmp._atime << std::endl;
    // std::cout << tmp._mtime << std::endl;
    // std::cout << tmp._realpath << std::endl;
    // std::cout << tmp._packpath << std::endl;
    // std::cout << tmp._url << std::endl;

    // std::cout << "--------------------- Update and GetAll ---------------------\n";
    // info._packflag = true;
    // data.Update(info);
    // std::vector<cloud::BackupInfo>array;
    // data.GetAll(array);
    // for(auto &a:array)
    // {
    //     std::cout << a._packflag << std::endl;
    //     std::cout << a._fsize << std::endl;
    //     std::cout << a._atime << std::endl;
    //     std::cout << a._mtime << std::endl;
    //     std::cout << a._realpath << std::endl;
    //     std::cout << a._packpath << std::endl;
    //     std::cout << a._url << std::endl;
    // }

    // std::cout << "-------------------   GetOneByRealPath    -------------------\n";
    // data.GetOneByRealPath(filename,tmp);
    // std::cout << tmp._packflag << std::endl;
    // std::cout << tmp._fsize << std::endl;
    // std::cout << tmp._atime << std::endl;
    // std::cout << tmp._mtime << std::endl;
    // std::cout << tmp._realpath << std::endl;
    // std::cout << tmp._packpath << std::endl;
    // std::cout << tmp._url << std::endl;

    // data.Storage();
}

cloud::DataManager *_data;
void HotTest()
{
    cloud::HotManager hot;
    hot.RunModule();
}
void ServiceTest()
{
    cloud::Service svr;
    svr.RunModule();
}
int main(int argc,char* argv[])
{
    _data = new cloud::DataManager();

    // FileTest(argv[1]);
    // JsonTest();
    // ConfigTest();
    // DataTest(argv[1]);
    // HotTest();
    // ServiceTest();
    std::thread HotManage(HotTest);
    std::thread ServiceManage(ServiceTest);
    HotManage.join();
    ServiceManage.join();

    return 0;
}